Syntax10.Scn.Fnt Syntax10i.Scn.Fnt ParcElems Alloc Syntax10b.Scn.Fnt Syntax8i.Scn.Fnt FoldElems MarkElems Alloc MODULE Directories; (* CS 10.10.95 based on Windows-FileDir from MH Feb 93 / 2.6.94 and PowerMac-Directories from HM Oct 95 *) IMPORT (*SYSTEM,*) TextFrames, O:=Console, Out, Files, AmigaDos, Strings; (*,Unix,directory*) CONST noErr* = 0; (**no error*) badName* = 1; (**bad file or directory name*) mediumFull* = 2; (**disk or directory full*) mediumLocked* = 3; (**hardware or software lock*) dirInUse* = 4; (**directory in use or not empty*) notADir* = 5; (**name does not specify a directory*) alreadyExists* = 6; (**directory already exists*) otherError* = 7; (**other OS-specific error*) delete* = 0; insert* = 1; change* = 2; (** notify operations **) delimiter* = "/"; (** delimiter in path names **) Directory* = POINTER TO DirectoryDesc; Entry* = POINTER TO EntryDesc; DirectoryDesc* = RECORD path*: ARRAY 256 OF CHAR; END; EntryDesc* = RECORD dir*: Directory; name*: ARRAY 32 OF CHAR; hostname*: ARRAY 14 OF CHAR END; FileProc* = PROCEDURE (d: Directory; name: ARRAY OF CHAR; isDir: BOOLEAN; VAR continue: BOOLEAN); PathProc* = PROCEDURE (path: ARRAY OF CHAR; VAR continue: BOOLEAN); Notifier* = PROCEDURE (op: INTEGER; path, name: ARRAY OF CHAR); FileInfoBlockPtr=POINTER TO AmigaDos.FileInfoBlock; (* Directories = POINTER TO ARRAY OF Directory;*) res*: INTEGER; notify*: Notifier; dirTab: POINTER TO ARRAY OF Directory; startupPath: ARRAY 256 OF CHAR; (*path containing the Oberon application*) nofPaths: INTEGER; CurrentDir: Directory; PROCEDURE AppendFile (VAR path: ARRAY OF CHAR; filename: ARRAY OF CHAR); VAR i, j, max: LONGINT; BEGIN i := 0; j := 0; max := LEN(path)-1; WHILE path[i] # 0X DO INC(i) END ; IF (i > 0) & (path[i-1] # delimiter) THEN path[i] := delimiter; INC(i) END ; WHILE (i < max) & (filename[j] # 0X) DO path[i] := filename[j]; INC(i); INC(j) END ; path[i] := 0X; END AppendFile; PROCEDURE InsertEntry* (D: Directory; e: Entry); BEGIN (* No meaning under Unix. *) END InsertEntry; PROCEDURE RemoveEntry* (e: Entry); BEGIN (* No meaning under Unix. *) END RemoveEntry; PROCEDURE ThisEntry* (D: Directory; VAR name: ARRAY OF CHAR): Entry; BEGIN RETURN NIL; END ThisEntry; PROCEDURE ThisHostEntry* (D: Directory; VAR hostname: ARRAY OF CHAR): Entry; BEGIN RETURN NIL; END ThisHostEntry; PROCEDURE ExpandPath (this: ARRAY OF CHAR; VAR absPath: ARRAY OF CHAR); current:ARRAY 256 OF CHAR; pwd:ARRAY 256 OF CHAR; fib : FileInfoBlockPtr; lock: AmigaDos.FileLockPtr; BEGIN IF AmigaDos.GetCurrentDirName(current, LEN(current)) THEN COPY(this, absPath); IF AmigaDos.SetCurrentDirName(absPath) THEN IF AmigaDos.GetCurrentDirName(pwd, LEN(pwd)) THEN COPY(pwd, absPath); (* Now we have to check wether this really is a directory. SetCurrentDir() even works with Files! <="0") & (ch<="9")); END CheckDigit; PROCEDURE CheckChar(ch: CHAR): BOOLEAN; BEGIN RETURN CheckDigit(ch) OR ((ch>="A") & (ch<="Z")) OR ((ch>="a") & (ch<="z")); END CheckChar; PROCEDURE CheckName(name: ARRAY OF CHAR): BOOLEAN; i: INTEGER; BEGIN IF CheckDigit(name[0]) THEN RETURN TRUE END; WHILE name[i]#0X DO IF ~CheckChar(name[i]) THEN RETURN TRUE END; INC(i); END; RETURN FALSE; END CheckName; BEGIN lock := AmigaDos.Lock(D.path,AmigaDos.sharedLock); IF lock#0 THEN NEW(fib); IF AmigaDos.Examine(lock, fib^) THEN continue := TRUE; LOOP IF AmigaDos.ExNext(lock,fib^) THEN (* Check wether there are illegal characters in the filename <0, continue) END; IF ~continue THEN EXIT END; ELSE IF AmigaDos.IoErr()=232 THEN EXIT END; (* Check for NO_MORE_ENTRIES *) END; END; END; AmigaDos.UnLock(lock); fib := NIL; END; END Enumerate; PROCEDURE Current*():Directory; current:ARRAY 256 OF CHAR; BEGIN IF CurrentDir=NIL THEN IF AmigaDos.GetCurrentDirName(current, LEN(current)) THEN END; CurrentDir:=This(current); END; RETURN CurrentDir; END Current; PROCEDURE Change*(path:ARRAY OF CHAR); D:Directory; rc:LONGINT; res: INTEGER; buf: ARRAY 256 OF CHAR; BEGIN D:=This(path); IF D#NIL THEN Files.ChangeDirectory(path, res); IF res=0 THEN (*IF AmigaDos.SetCurrentDirName(path) THEN*) res:=noErr; CurrentDir:=D; notify(change,"",""); RETURN; END; END; (* Try to change relative to startup path *) (*<